package com.aijk.commons.utils;

import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * <P>参数签名工具类</P>
 * <p>
 * 将请求参数格式化为“key=value”格式，即“k1=v1”、“k2=v2”、“k3=v3”；
 * 将格式化好的参数键值对以字典序升序排列后，拼接在一起，即“k1=v1k2=v2k3=v3”；
 * 上述字符串的MD5值即为签名的值。
 * </P>
 * Created by iscdw on 2016/5/22.
 */
public class SignUtils {

    /**
     * 签名生成算法
     *
     * @param params params 请求参数集，所有参数必须已转换为字符串类型
     * @param secret secret 签名密钥
     * @return 签名
     * @throws IOException
     */
    public static String getSignature(Map<String, String> params, String secret){
        // 先将参数以其参数名的字典序升序进行排序
        Map<String, String> sortedParams = new TreeMap<String, String>(params);
        sortedParams.remove("sign"); // sign参数不参与签名
        sortedParams.remove("secret"); // sign参数不参与签名
        Set<Map.Entry<String, String>> entrys = sortedParams.entrySet();

        // 遍历排序后的字典，将所有参数按"key=value"格式拼接在一起
        StringBuilder basestring = new StringBuilder();
        for (Map.Entry<String, String> param : entrys) {
            basestring.append(param.getKey()).append("=").append(param.getValue());
        }
        basestring.append(secret);

        // 使用MD5对待签名串求签
        return MD5Util.MD5(basestring.toString());
    }
}
